J2me的基本概念

新觉青年

本文主要介绍 J2me 的基本概念。因为注意到国内的 java 站点介绍 J2me 的还比较少,所以就写了本文。如果有什么不妥的地方,欢迎您 email 我,讨论商榷。1.名词
这里我列出一些常见的关键词,方便与下文参照.具体解释见后文.
J2ME(Java2 Platform, Micro Edition)
CLDC(Connected, Limited Device Configuration)
MIDP(Mobile Information Device Profile)
KVM(The K Virtual Machine)

2.背景
随着无线应用与嵌入式系统的愈来愈受到人们的重视,SUN 也推出了 J2ME 来迎合这一趋势.(实际上道也不能算是新推出,熟悉 Java 历史的人都知道,java 原先本是为了开发消费性电子产品而研制的.谁知,无心插柳柳成荫,因在网络应用上的出色表现而流行,以致现在的 J2EE、EJB 等等,发展地越来越庞大。这次实质是杀了个回马枪。至于表现如何,还得拭目以待)sun 认为,未来的信息设备将比我们今天的更为 customizable 和 personal。这一点我们已经可以从手机和 pda 的流行程度看出。所以为了开发面向这些设备的 applications。sun 推出了 J2ME(Java2 Platform, Micro Edition)。

3.j2me 的基本结构
j2me 把设备分为两类,一种是联接设备(connected device),一种是有限联接设备(Connected, Limited Device)。前一种对应于那些有电源的,电力充裕,较大的设备。例如:电视机,冰箱等,后一种对应于主要使用电池,小型的设备,例如:手机,pda 等。这里我只涉及第二种,有限联接设备(Connected, Limited Device)。

3.j2me 的基本结构
sun 把 J2me 分为两个部分:configuration 和 profile。
configuration 包括虚拟机(virtual machine),核心的类库与 API。configuration 层定义一个 java 虚拟机的特性与 java 类库的最小子集。也就是说,configuration 层提供了开发人员一个最基础,最核心的 Java 平台。就像我前文提到的,j2me 把设备分为两类,一种是联接 设备(connected device),一种是有限联接设备(Connected, Limited Device)。对应这两种设备就有了两种 J2ME configuration。分别为 CDC(Connected Device Con-figuration)和 CLDC(Connected, Limited Device Configuration)。这里请注意,CDC 使用经典的 javaVM,而 CLDC 使用的是 KVM(The K Virtual Machine)。
注:kvm 是 sun 为使用 16/32 位 RISC/CISC 微处理器或控制器,并其可用内存为 160kb~512kb 的的设备而开发的。
Profile 层也包含一组 API,主要针对于特定的某一族系的设备而定义。profile 层在特定的 configuration 层上实现,而我们程序员则负责在特定的 profile 上编写应用程序。对于手机,pda 等 Connected, Limited Device。它们的 profile 层称为 MIDP(Mobile InformationDevice Profile)。于是 MIDP 与 CLDC 合在一起就构成了一个完整的 J2ME 架构。
顺便说一句,对于 MIDP 上的应用程序 sun 也有独特的叫法,它们被称为 MIDlet。你是不是觉得有点眼熟。想想 java 中的 applet。
┌───────┐┄┄┄┄┄┄┄
│MIDlet │ 应用程序
├───────┤┈┈┈┈┈┈┈
│ MIDP │ proflie 层
├───────┤┄┄┄┄┄┄┄
│J2ME 核心 API │ configuration 层
├───────┤ CLDC
│ KVM │
├───────┤┈┄┄┄┄┄┄
│特定的硬件 │
└───────┘
图 1 J2ME 的 CLDC&MIDP 架构

4。深入理解 CLDC
本节的部分内容译自 J2ME White Paper,比较枯燥,但请记住,毕竟,正确的观念重于一切。
CLDC 的目的
·为小型的,且资源有限,Connected Limited 的设备定义一个标准的 Java 平台。
·允许动态的向这些设备发布内容与应用程序。
·方便第三方软件厂商与开发者向这些设备移植内容与应用程序。
CLDC 的范围
·Java 语言与虚拟机的特性
·核心 Java 类库(如 java.lang.)
·输入/输出
·对网络的支持
·对安全性的支持
·对国际化的支持
CLDC 不包括的范围(即由 MIDP 解决的)
·对应用程序 life-cycle 的管理(就是指一个应用程序是如何安装,运行,删除的)
·UI 界面(User Interface)
·Event 处理
·高级应用程序模式(这里指用户与应用程序的交互)。
CLDC 的安全性
低端的基于虚拟机的安全性由下载时对 class 文件的审核(verification)步骤来保证。(如果你写过并编译过 MIDlet 程序,就会知道这一步是必须的。这里有一个概念就行了,我会在以后讲述如何创建 MIDlet 程序时,详细介绍具体的步骤)。
基于应用程序的安全性通过使每个应用程序分别运行在相对独立的封闭环境中来保证并且处于被保护的系统 package 中的类不能被应用程序重载(overridded)。
对于 Java 语言支持的特殊的方面
CLDC 总的来说是与 Java 语言完全兼容的,但需注意以下几点:
不支持浮点数据类型(即没有 float 和 double)(这实际上主要是由于 CLDC 所面向的设备,其硬件因其内存限制或是基于安全性的考虑不支持浮点运算)
不支持类实例(class instance)的终结(finalization),即不存 Object.finalize()方法。(注:finalization 指的是 java 中提供的有别与 garbage collection 的另外的一种对象清理方法。具体可参看侯捷老师译的 Bruce Eckel 的《Thinking in Java 第二版》,可以在 www.jjhou.com 中下载)
有限的错误处理,即大部分 Java.lang.Error 的子类都未被支持。与此相反,CLDC 包括了相当完备的异常(exception)类。
对于 Java 虚拟机(Java Virtual Machine)支持的特殊的方面
实质上 CLDC 在其严格的内存限制下达到了对 Java 虚拟机相当程度的兼容性。不过还是有下列不同点。
·不支持浮点数据类型(没有 float 和 double)
·不支持 JNI(the Java Native Interface)
·不支持用户自定义的 Java 级的类载入器(class loaders)
·没有反射(reflection)特性(注:reflection 指 java 通过 java.lang.reflect 提供的,可以对类的能力进行分析的功能。常用来对类的结构进行检查,在 JavaBeans 上有广泛运用可参见 Gary Cornell 的 Core Java2 volumeI,II,机工有出中译本)
·不支持线程组(thread groups)或守护线程(daemon threads)
·不支持类实例(class instance)的终结(finalization)
·没有弱参考(weak references)(注:weak reference 提供了一种解决指向已经被 garbage collector 清除的对象的方法。在 Java2 中被介绍。具体请参考 java.lang.ref API 文档,和 sun 网站上关于 Reference Objects 和 Garbage Collection 的文章。)
·有限的错误处理(error handling)

4。深入理解 CLDC(part II)
本节的部分内容译自 J2ME White Paper,比较枯燥,但请记住,毕竟,正确的观念重于一切。
类文件审核过程(classfiles Verification)
CLDC 要求其下层的虚拟机能够辨别并拒绝非法的 class 文件。但由于 CLDC 本身面向小内存消耗的小型设备这一前提。其类文件检测机制与 J2SE 中定义的标准类文件审核机制还有所不同。请注意看下图:
MyApp.java


┌───┐
│Javac │┄编译器
└───┘

MyApp.class

┌──────┐
│preverifier │┈预审核器
└──────┘

MyApp.class

↓download...
┌────────┒
│ ┠┄┄KVM 运行环境
│┌──────┐┃(目标设备)
││ verifier │┃
│└──────┘┃
│ ┃
│┌──────┐┃
││ │┃
││interpreter │┃
││ │┃
│└──────┘┃
┕━━━━━━━━┛
图 2 CLDC/KVM 中类文件的审核过程
请注意 CLDC 中的预审核(preverification)过程。这是 CLDC 区别于通常的类文件审核过程的关键。如上图所示,当源程序被编译后,必须被预审核器预审核,然后才能被下载到目标设备上去。之所以有这一步骤,主要是为了减轻 KVM 中审核器的负担,加快审核速度。就像我前文提到的,这是出于对 CLDC 支持的硬件的考虑(毕竟手机和 PDA 并没有我们 PC 机那样奔腾的“芯”呀!^-^)。这里记住这个概念就行了。具体的操作方法我会在以后讲述编写 MIDlet 程序时介绍。
类文件格式
sun 要求通过 Jar(compressed Java Archive)给 Java 应用程序打包,这里也不例外。所以如果你想把你的 MIDlet 程序下载到设备上运行,你就得先用 jar 打包。具体的操作方法我会在以后讲述编写 MIDlet 程序时介绍。
CLDC 的类库
如果不严格的说,CLDC 的类库是 J2SE 的一个小的子集,有以下这种近似关系成立,即 J2SE 包含 CDC 包含 CLDC。但要注意 CLDC 并未完全包含于 J2SE,它还包括一 些专门针对无线设施的类。所以可以把 CLDC 的类库简要划分为两部分:从 J2SE 继承的类和 CLDC 专有的类。
(1)从 J2SE 继承的类
这部分包括三个 package,即 java.lang,java.util 和 java.io。注意即使这些从 J2SE 继承的的类,也是大大“缩了水”的。例如 java.util 的类与接口由 J2SE 的 47 个缩减到 10 个。另外两个也有相应缩减。
系统类
From java.lang:
Object, Class, Runtime, System, Thread, Runnable,
String, StringBuffer, Throwable
数据类型类
From java.lang:
Boolean, Byte, Short, Integer, Long, Character
容器类(container class)
From java.util:
Vector, Stack, Hashtable, Enumeration
I/O 类
From java.io:
InputStream, OutputStream, ByteArrayInputStream,
ByteArrayOutputStream, DataInput, DataOutput,
DataInputStream, DataOutputStream, Reader, Writer,
InputStreamReader, OutputStreamWriter, PrintStream
日期与时间类
From java.util:
Calendar, Date, TimeZone
附加的实用类
java.util.Random, java.lang.Math
异常类(Exception Classes)
From java.lang:
Exception, ClassNotFoundException,
IllegalAccessException, InstantiationException,
InterruptedException, RuntimeException,
ArithmeticException, ArrayStoreException,
ClassCastException, IllegalArgumentException,
IllegalThreadStateException, NumberformatException,
IllegalMonitorStateException, IndexOutOfBoundsException,
ArrayIndexOutOfBoundsException,
StringIndexOutOfBoundsException,
NegativeArraySizeException, NullPointerException,
SecurityException
From java.util:
EmptyStackException, NoSuchElementException
From java.io:
EOFException, IOException, InterruptedException,
UnsupportedEncodingException, UTFDataformatException
错误类
From java.lang:
Error, VirtualMachineError, OutOfMemoryError
(2)CLDC 专有的类
这里 sun 提供了 javax.microedition.io 包。用它来提供与外界沟通的桥梁。(注:就像在 J2SE 中我们利用 java.net.*)注意,所有的连接都由 javax.microedition.Connector 创建。例如:你可以打开一个 http 连接通过 Connector.open("http://www.chinajavaworld.com")
javax.microedition.io 的接口包括:
Connection, InputConnection, OutputConnection,
StreamConnection, ContentConnection, DatagramConnection,
StreamConnectionNotifier
这里再说明一点,实际上你也可以看出,CLDC 所包括的类库,并不足以开发应用程序。例如,没有 UI 界面的支持等。这也正是 CLDC 的设计理念。CLDC 本身就从未想过要解决所有的问题。这些问题要靠其上层的 Profile-MIDP 来解决。例如 javax.microedition.lcdui 就是定义在 MIDP 中的 UI 包。

添加新评论